<!doctype html>
<html lang="zh-cn">
<head>

    <meta charset="utf-8">
    <meta name="generator" content="Hugo 0.57.2" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Freemarker 学习 | The Sky of OtsWang</title>
    <meta property="og:title" content="Freemarker 学习 - The Sky of OtsWang">
    <meta property="og:type" content="article">
        
    <meta property="article:published_time" content="2019-03-13T09:38:19&#43;08:00">
        
        
    <meta property="article:modified_time" content="2019-03-13T09:38:19&#43;08:00">
        
    <meta name="Keywords" content="golang,go语言,otswang,java,博客,python">
    <meta name="description" content="Freemarker 学习">
        
    <meta name="author" content="OtsWang">
    <meta property="og:url" content="https://otswang.gitee.io/hugo/post/java/freemarker/">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href="/hugo/css/normalize.css">
    
        <link rel="stylesheet" href="/hugo/css/prism.css">
    
    <link rel="stylesheet" href="/hugo/css/style.css">
    <script type="text/javascript" src="//cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>

    


    
    
</head>

<body>
<header id="header" class="clearfix">
    <div class="container">
        <div class="col-group">
            <div class="site-name ">
                
                    <a id="logo" href="https://otswang.gitee.io/hugo/">
                        The Sky of OtsWang
                    </a>
                
                <p class="description">擅长写HelloWorld的小小码农</p>
            </div>
            <div>
                <nav id="nav-menu" class="clearfix">
                    
                    
                    <a  href="https://otswang.gitee.io/hugo/" title="Home">Home</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/tags/" title="Tags">Tags</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/categories/" title="Categories">Categories</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/archives/" title="Archives">Archives</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/about/" title="About">About</a>
                    
                </nav>
            </div>
        </div>
    </div>
</header>


<div id="body">
    <div class="container">
        <div class="col-group">

            <div class="col-8" id="main">
                <div class="res-cons">
                    <article class="post">
                        <header>
                            <h1 class="post-title">Freemarker 学习</h1>
                        </header>
                        <date class="post-meta meta-date">
                            2019年3月13日
                        </date>
                        
                        <div class="post-meta">
                            <span>|</span>
                            
                                <span class="meta-category"><a href="https://otswang.gitee.io/hugo/categories/java">Java</a></span>
                            
                        </div>
                        
                        
                        
                        <div class="post-content">
                            <p>FreeMarker是一个很值得去学习的模版引擎。它是基于模板文件生成其他文本的通用工具。</p>

<h2 id="简介">简介</h2>

<p>FreeMarker 是一款 模板引擎： 即一种基于模板和要改变的数据， 并用来生成输出文本(HTML网页，电子邮件，配置文件，源代码等)的通用工具。 它不是面向最终用户的，而是一个Java类库，是一款程序员可以嵌入他们所开发产品的组件。</p>

<p>模板编写为FreeMarker Template Language (FTL)。它是简单的，专用的语言。 那就意味着要准备数据在真实编程语言中来显示，比如数据库查询和业务运算， 之后模板显示已经准备好的数据。在模板中，你可以专注于如何展现数据， 而在模板之外可以专注于要展示什么数据。</p>

<p>这种方式通常被称为MVC模式，对于动态网页来说，是一种特别流行的模式。 它帮助从开发人员(Java 程序员)中分离出网页设计师(HTML设计师)。设计师无需面对模板中的复杂逻辑， 在没有程序员来修改或重新编译代码时，也可以修改页面的样式。</p>

<p>而FreeMarker最初的设计，是被用来在MVC模式的Web开发框架中生成HTML页面的，但它没有被绑定到 Servlet或HTML或任意Web相关的东西上，因此也可以用于非Web应用环境中。</p>

<h2 id="使用">使用</h2>

<p>在程序中使用FreeMarker，只需要在maven项目中引入如下依赖即可;</p>

<pre><code class="language-xml">    &lt;dependency&gt;   
        &lt;groupId&gt;org.freemarker&lt;/groupId&gt; 
        &lt;artifactId&gt;freemarker&lt;/artifactId&gt; 
        &lt;version&gt;2.3.20&lt;/version&gt; 
    &lt;/dependency&gt;
</code></pre>

<p>在代码中使用FreeMarker，分为以下几步：</p>

<ul>
<li><p>创建FreeMarker配置实例</p>

<pre><code class="language-java">Configuration configuration = new Configuration();
</code></pre></li>

<li><p>获取模版路径</p>

<pre><code class="language-java">configuration.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH));
</code></pre></li>

<li><p>创建数据模型</p>

<pre><code class="language-java">Map&lt;String, Object&gt; dataMap = new HashMap&lt;&gt;();
dataMap.put(&quot;name&quot;, &quot;otswang&quot;);
dataMap.put(&quot;dataTime&quot;, new Date());
        
List&lt;User&gt; users = new ArrayList&lt;&gt;();
users.add(new User(1, &quot;ots&quot;));
users.add(new User(2, &quot;wang&quot;));
users.add(new User(3, &quot;smj&quot;));
        
dataMap.put(&quot;users&quot;, users);
</code></pre></li>

<li><p>加载模版文件</p>

<pre><code class="language-java">Template template = configuration.getTemplate(&quot;hello.ftl&quot;);

// ftl为FreeMarker模版文件的后缀名。
</code></pre></li>

<li><p>生成数据与输出</p>

<pre><code class="language-java">template.process(dataMap, out);
</code></pre>

<p>out为Writer类型的输出流，可以输出到文件或者输出到string等。</p>

<h2 id="语法">语法</h2>

<p>字符串输出：
${&ldquo;Hello ${name} !&rdquo; } or ${&ldquo;hello&rdquo; + name + &ldquo; !&rdquo;}</p>

<p>&lt;#assign cname = r&rdquo;特殊字符输出使用r（http:\www.baidu.com)&rdquo; &gt;
${cname}</p>

<p>字符串截取：
通过下标获取name中字符： ${name[2]}
起点&hellip;结尾下标截取name: ${name[0..5]}</p>

<p>算数运算：
&lt;#&ndash; 支持 + - * / % 等运算 &ndash;&gt;
&lt;#assign number1 = 10 &gt;
&lt;#assign number2 = 5 &gt;
&ldquo;+&rdquo; : ${number1 + number2}
&ldquo;-&rdquo; : ${number1 - number2}
&ldquo;*&rdquo; : ${number2 * number1}
&ldquo;/&rdquo; : ${number1 / number2}
&ldquo;%&rdquo; : ${number1 % number2}</p>

<p>比较运算符:
&lt;#if number1 + number2 gte 12 || number1 - number2 lt 6 &gt;
    &ldquo;*&rdquo; : ${number1 * number2}
&lt;#else&gt;<br />
    &ldquo;/&rdquo; : ${number1 / number2}
&lt;/#if&gt;</p>

<p>内建函数：
&lt;#assign data = &ldquo;abcd1234&rdquo; &gt;
初始字符： ${data}
第一个字母大写： ${data?cap_first}
所有字母大写： ${data?upper_case}
所有字母小写： ${data?lower_case}</p>

<p>&lt;#assign floatData = 12.345 &gt;
初始数字为： ${floatData}
数值取整： ${floatData?int}
获取长度： ${users?size}</p>

<p>时间格式化：</p>

<p>时间格式化为： ${dataTime?string(&ldquo;yyyy-MM-dd&rdquo;)}</p>

<p>为空判断和对象
&lt;#if users??&gt;
    &lt;#list users as user&gt;
        ${user.id} - ${user.name}
    &lt;/#list&gt;
&lt;#else&gt;<br />
    ${user!&ldquo;默认值&rdquo;}
&lt;/#if&gt;</p>

<p>Map 集合：
&lt;#assign mapData = {&ldquo;name&rdquo;: &ldquo;ots&rdquo;, &ldquo;sex&rdquo; : &ldquo;male&rdquo;}&gt;
获取key的值： ${mapData[&ldquo;name&rdquo;]}
遍历key
&lt;#list mapData? keys as key&gt;
    key : ${key} - value : ${mapData[key]}
&lt;/#list&gt;</p>

<p>遍历value
&lt;#list mapData? values as value&gt;
    value ： ${value}
&lt;/#list&gt;</p>

<p>List集合
&lt;#assign listData=[&ldquo;test01&rdquo;, &ldquo;test02&rdquo;, &ldquo;test03&rdquo;, &ldquo;test04&rdquo;]&gt;
    &lt;#list listData as value&gt; ${value} &lt;/#list&gt;</p>

<p>include 指令：
引入其他文件： &lt;#include &ldquo;otherFreeMarker.ftl&rdquo; /&gt;</p>

<p>macro指令：
&lt;#macro mo&gt;
    定义无参数macro &ndash; ${name}
&lt;/#macro&gt;</p>

<p>使用macro： &lt;@mo /&gt;</p>

<p>&lt;#macro moArgs a b c&gt;
定义带参数macro &ndash; ${a + b + c}
&lt;/#macro&gt;</p>

<p>使用带参数的macro： &lt;@moArgs a=1 b=2 c=3 /&gt;</p>

<p>命令空间：
&lt;#import &ldquo;otherFreeMarker.ftl&rdquo; as otherFtl&gt;
${otherFtl.otherName}
&lt;@otherFtl.addMethod a=10 b=20 /&gt;
&lt;#assign otherName = &ldquo;修改otherFreeMarker.ftl中的otherName变量&rdquo; /&gt;
${otherFtl.otherName}
&lt;#assign otherName = &ldquo;修改otherFreeMarker.ftl中的otherName变量2&rdquo; in otherFtl /&gt;
${otherFtl.otherName}</p></li>
</ul>

<p>include指令为引用另外一个文件，</p>

<p>其他FreeMarker文件</p>

<pre><code>&lt;#macro addMethod a b&gt;
result: ${a + b}
&lt;/#macro&gt;

&lt;#assign otherName=&quot;另一个FreeMarker变量&quot; &gt;
</code></pre>

<h1 id="备注">备注</h1>

<p>代码输出为;</p>

<pre><code>字符串输出：
Hello otswang ! or hellootswang !

特殊字符输出使用r（http:\www.baidu.com)

字符串截取：
通过下标获取name中字符： s
起点...结尾下标截取name: otswan

算数运算：
&quot;+&quot; : 15
&quot;-&quot; : 5
&quot;*&quot; : 50
&quot;/&quot; : 2
&quot;%&quot; : 0

比较运算符:
    &quot;*&quot; : 50

内建函数：
初始字符： abcd1234
第一个字母大写： Abcd1234
所有字母大写： ABCD1234
所有字母小写： abcd1234

初始数字为： 12.345
数值取整： 12
获取长度： 3

时间格式化：

时间格式化为： 2018-07-30

为空判断和对象
    1 - ots
    2 - wang
    3 - smj

Map 集合：
获取key的值： ots
遍历key
    key : name - value : ots
    key : sex - value : male

遍历value
    value ： ots
    value ： male

List集合
    test01 test02 test03 test04 

include 指令：
引入其他文件： 其他FreeMarker文件

    

macro指令：

使用macro： 定义无参数macro -- otswang



使用带参数的macro： 定义带参数macro -- 6


命令空间： 
另一个FreeMarker变量
result: 30
另一个FreeMarker变量
修改otherFreeMarker.ftl中的otherName变量2

</code></pre>

<h1 id="后记">后记</h1>

<ul>
<li>一般都是使用${} 插值</li>
</ul>

<p>js中取得freemarker的值(但是一般模板引擎中的值不会改变，需要Java编译后才可？经由后台走一圈才可以)：</p>

<pre><code class="language-html">&lt;script type=&quot;text/javascript&quot;&gt;
    var temp = &quot;${user.name}&quot;;
    console.log(temp);
&lt;/script&gt;
</code></pre>
                        </div>

                        


                        

<div class="post-archive">
    <h2>See Also</h2>
    <ul class="listing">
        
        <li><a href="/hugo/post/java/thymeleaf/">Thymeleaf学习</a></li>
        
    </ul>
</div>


                        <div class="post-meta meta-tags">
                            
                            <ul class="clearfix">
                                
                                <li><a href="https://otswang.gitee.io/hugo/tags/%E6%A8%A1%E6%9D%BF%E5%BC%95%E6%93%8E">模板引擎</a></li>
                                
                                <li><a href="https://otswang.gitee.io/hugo/tags/freemarker">Freemarker</a></li>
                                
                            </ul>
                            
                        </div>
                    </article>
                    
    

    
    
                </div>
            </div>
            <div id="secondary">

    <section class="widget">
        <form id="search" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank" _lpchecked="1">
      
      <input type="text" name="q" maxlength="20" placeholder="Search">
      <input type="hidden" name="sitesearch" value="https://otswang.gitee.io/hugo/">
      <button type="submit" class="submit icon-search"></button>
</form>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">最近文章</h3>
<ul class="widget-list">
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/middle_tools/kafka/" title="Kafka">Kafka</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/middle_tools/zk_starter/" title="Zookeeper Starter">Zookeeper Starter</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/java/javafx_starter/" title="Java Fx 入门学习">Java Fx 入门学习</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/codec/" title="常用加密/签名算法">常用加密/签名算法</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/docker/" title="Docker学习">Docker学习</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/webapp/react_starter/" title="React 从入门到入门">React 从入门到入门</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/lang/csharpe_starter/" title="C#语言从入门到入门">C#语言从入门到入门</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/java/java8time/" title="Java checklist">Java checklist</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/keyboard/" title="快捷键记录">快捷键记录</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/vim/" title="vim 使用记录">vim 使用记录</a>
    </li>
    
</ul>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">分类</h3>
<ul class="widget-list">
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/algorithm/">algorithm(4)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/design/">design(7)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/doc/">doc(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/go/">go(3)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java/">java(7)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-java8inaction/">java-java8inaction(11)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-juc/">java-juc(3)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-jvm/">java-jvm(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-spring/">java-spring(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-thinkinginjava/">java-thinkinginjava(11)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/middletools/">middletools(9)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/other/">other(24)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/qt/">qt(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/smallquickappweb/">smallquickappweb(4)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/webapp/">webapp(1)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/%E5%B0%8F%E4%BC%97%E8%AF%AD%E8%A8%80%E4%B8%80%E7%9E%A5/">小众语言一瞥(4)</a>
    </li>
    
</ul>
    </section>

    <section class="widget">
        <h3 class="widget-title">标签</h3>
<div class="tagcloud">
    
    <a href="https://otswang.gitee.io/hugo/tags/c/">c#</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/checklist/">checklist</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/codec/">codec</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/docker/">docker</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/elk/">elk</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/emmet/">emmet</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/file/">file</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/freemarker/">freemarker</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/git/">git</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/go/">go</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/http/">http</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/interview/">interview</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/java/">java</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/javascript/">javascript</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/juc/">juc</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/jvm/">jvm</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/keyboard/">keyboard</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/linux/">linux</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/lua/">lua</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/manjaro/">manjaro</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/map/">map</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/markdown/">markdown</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mq/">mq</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mybatis/">mybatis</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mycat/">mycat</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mysql/">mysql</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/nginx/">nginx</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/qt/">qt</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/react/">react</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/redis/">redis</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/rust/">rust</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/spring/">spring</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/springboot/">springboot</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/stream/">stream</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/tcp/">tcp</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/thymeleaf/">thymeleaf</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/tree/">tree</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/uml/">uml</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/vim/">vim</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/vlang/">vlang</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/vue/">vue</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/zookeeper/">zookeeper</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E4%BD%8D%E8%BF%90%E7%AE%97/">位运算</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%8D%8F%E8%AE%AE/">协议</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/">多线程</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%B9%B6%E5%8F%91%E9%9B%86%E5%90%88/">并发集合</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/">微信小程序</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%BF%AB%E5%BA%94%E7%94%A8/">快应用</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E6%97%B6%E9%97%B4%E7%B1%BB/">时间类</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E6%A8%A1%E6%9D%BF%E5%BC%95%E6%93%8E/">模板引擎</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E7%AE%97%E6%B3%95/">算法</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E7%BC%96%E7%A8%8B/">编程</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E7%BC%96%E7%A8%8B%E8%A7%84%E8%8C%83/">编程规范</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E8%AE%BE%E8%AE%A1/">设计</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">设计模式</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E9%99%90%E6%B5%81/">限流</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/">面向对象</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E9%9D%A2%E8%AF%95/">面试</a>
    
</div>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">其它</h3>
        <ul class="widget-list">
            <li><a href="https://otswang.gitee.io/hugo/index.xml">文章 RSS</a></li>
        </ul>
    </section>

    

</div>
        </div>
    </div>
</div>
<footer id="footer">
    <div class="container">
        &copy; 2020 <a href="https://otswang.gitee.io/hugo/">The Sky of OtsWang By OtsWang</a>.
        Powered by <a rel="nofollow noreferer noopener" href="https://gohugo.io" target="_blank">Hugo</a>.
        <a href="https://www.flysnow.org/" target="_blank">Theme</a> based on <a href="https://github.com/Dudiao137/maupassant-hugo" target="_blank">maupassant-ots</a>.
        
    </div>
</footer>


    <script type="text/javascript">
    
    (function(){
        $("pre code").parent().addClass("line-numbers")
    }())

    window.MathJax = {
        tex2jax: {
            inlineMath: [ ['$','$'] ],
            processEscapes: true
        }
    };
    </script>
    <script type="text/javascript" src="/hugo/js/prism.js" async="true"></script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML' async></script>

<a id="rocket" href="#top"></a>
<script type="text/javascript" src="/hugo/js/totop.js?v=0.0.0" async=""></script>







 
 <script src="https://mermaidjs.github.io/scripts/mermaid.min.js"></script>
 <script>
       mermaid.initialize({ startOnLoad: true });
 </script>
</body>
</html>
